home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / rx / _rx.h next >
C/C++ Source or Header  |  1998-01-28  |  5KB  |  177 lines

  1. /* classes: h_files */
  2.  
  3. #ifndef _RXH
  4. #define _RXH
  5.  
  6. /*    Copyright (C) 1995, 1996 Tom Lord
  7.  * 
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU Library General Public License as published by
  10.  * the Free Software Foundation; either version 2, or (at your option)
  11.  * any later version.
  12.  * 
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU Library General Public License for more details.
  17.  * 
  18.  * You should have received a copy of the GNU Library General Public License
  19.  * along with this software; see the file COPYING.  If not, write to
  20.  * the Free Software Foundation, 59 Temple Place - Suite 330, 
  21.  * Boston, MA 02111-1307, USA. 
  22.  */
  23.  
  24.  
  25.  
  26. #include <sys/types.h>
  27. #include "rxhash.h"
  28. #include "rxcset.h"
  29.  
  30.  
  31.  
  32. struct rx_cache;
  33. struct rx_superset;
  34. struct rx;
  35. struct rx_se_list;
  36.  
  37.  
  38.  
  39. /* Suppose that from some NFA state and next character, more than one
  40.  * path through side-effect edges is possible.  In what order should
  41.  * the paths be tried?  A function of type rx_se_list_order answers
  42.  * that question.  It compares two lists of side effects, and says
  43.  * which list comes first.
  44.  */
  45.  
  46. #ifdef __STDC__
  47. typedef int (*rx_se_list_order) (struct rx *,
  48.                  struct rx_se_list *, 
  49.                  struct rx_se_list *);
  50. #else
  51. typedef int (*rx_se_list_order) ();
  52. #endif
  53.  
  54.  
  55.  
  56. /* Struct RX holds an NFA and cache state for the corresponding super NFA.
  57.  */
  58. struct rx
  59. {
  60.   /* The compiler assigns a unique id to every pattern.
  61.    * Like sequence numbers in X, there is a subtle bug here
  62.    * if you use Rx in a system that runs for a long time.
  63.    * But, because of the way the caches work out, it is almost
  64.    * impossible to trigger the Rx version of this bug.
  65.    *
  66.    * The id is used to validate superstates found in a cache
  67.    * of superstates.  It isn't sufficient to let a superstate
  68.    * point back to the rx for which it was compiled -- the caller
  69.    * may be re-using a `struct rx' in which case the superstate
  70.    * is not really valid.  So instead, superstates are validated
  71.    * by checking the sequence number of the pattern for which
  72.    * they were built.
  73.    */
  74.   int rx_id;
  75.  
  76.   /* This is memory mgt. state for superstates.  This may be 
  77.    * shared by more than one struct rx.
  78.    */
  79.   struct rx_cache * cache;
  80.  
  81.   /* Every nfa defines the size of its own character set. 
  82.    * Each superstate has an array of this size, with each element
  83.    * a `struct rx_inx'.  So, don't make this number too large.
  84.    * In particular, don't make it 2^16.
  85.    */
  86.   int local_cset_size;
  87.  
  88.   /* Lists of side effects as stored in the NFA are `hash consed'..meaning
  89.    * that lists with the same elements are ==.  During compilation, 
  90.    * this table facilitates hash-consing.
  91.    */
  92.   struct rx_hash se_list_memo;
  93.  
  94.   /* Lists of NFA states are also hashed. 
  95.    */
  96.   struct rx_hash set_list_memo;
  97.  
  98.  
  99.  
  100.   /* The compiler and matcher must build a number of instruction frames.
  101.    * The format of these frames is fixed (c.f. struct rx_inx).  The values
  102.    * of the instruction opcodes is not fixed.
  103.    *
  104.    * An enumerated type (enum rx_opcode) defines the set of instructions
  105.    * that the compiler or matcher might generate.  When filling an instruction
  106.    * frame, the INX field is found by indexing this instruction table
  107.    * with an opcode:
  108.    */
  109.   void ** instruction_table;
  110.  
  111.   /* The list of all states in an NFA.
  112.    * The NEXT field of NFA states links this list.
  113.    */
  114.   struct rx_nfa_state *nfa_states;
  115.   struct rx_nfa_state *start_nfa_states;
  116.   struct rx_superset * start_set;
  117.  
  118.   /* This orders the search through super-nfa paths.
  119.    * See the comment near the typedef of rx_se_list_order.
  120.    */
  121.   rx_se_list_order se_list_cmp;
  122.  
  123.   int next_nfa_id;
  124. };
  125.  
  126.  
  127.  
  128. /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
  129.  * `re_match_2' returns information about at least this many registers
  130.  * the first time a `regs' structure is passed. 
  131.  *
  132.  * Also, this is the greatest number of backreferenced subexpressions
  133.  * allowed in a pattern being matched without caller-supplied registers.
  134.  */
  135. #ifndef RE_NREGS
  136. #define RE_NREGS 30
  137. #endif
  138.  
  139.  
  140. #ifndef emacs
  141. #define CHARBITS 8
  142. #define CHAR_SET_SIZE (1 << CHARBITS)
  143. #define Sword 1
  144. #define SYNTAX(c) re_syntax_table[c]
  145. extern char re_syntax_table[CHAR_SET_SIZE];
  146. #endif
  147.  
  148.  
  149. /* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
  150.  * use `alloca' instead of `malloc' for the backtracking stack.
  151.  *
  152.  * Emacs will die miserably if we don't do this.
  153.  */
  154.  
  155. #ifdef REGEX_MALLOC
  156. #define REGEX_ALLOCATE malloc
  157. #else /* not REGEX_MALLOC  */
  158. #define REGEX_ALLOCATE alloca
  159. #endif /* not REGEX_MALLOC */
  160.  
  161. #undef MAX
  162. #undef MIN
  163. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  164. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  165. extern void * rx_id_instruction_table[];
  166. extern struct rx_cache * rx_default_cache;
  167.  
  168.  
  169. #ifdef __STDC__
  170.  
  171. #else /* STDC */
  172.  
  173. #endif /* STDC */
  174.  
  175.  
  176. #endif  /* _RXH */
  177.